export function escapeHTML(a) {
  a = '' + a
  return a.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;')
}

/**
 * @function unescapeHTML 还原html脚本 < > & " '
 * @param a -
 *            字符串
 */
export function unescapeHTML(a) {
  a = '' + a
  return a.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/&apos;/g, "'")
}



/**
 * 对象深拷贝
 */
export function deepClone(data) {
  var type = getObjType(data)
  var obj
  if (type === 'array') {
    obj = []
  } else if (type === 'object') {
    obj = {}
  } else {
    // 不再具有下一层次
    return data
  }
  if (type === 'array') {
    for (var i = 0, len = data.length; i < len; i++) {
      data[i] = (function () {
        if (data[i] === 0) {
          return data[i]
        }
        return data[i]
      }())
      delete data[i].$parent
      obj.push(deepClone(data[i]))
    }
  } else if (type === 'object') {
    for (var key in data) {
      delete data.$parent
      obj[key] = deepClone(data[key])
    }
  }
  return obj
}

export function getObjType(obj) {
  var toString = Object.prototype.toString
  var map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regExp',
    '[object Undefined]': 'undefined',
    '[object Null]': 'null',
    '[object Object]': 'object'
  }
  if (obj instanceof Element) {
    return 'element'
  }
  return map[toString.call(obj)]
}

export function validatenull(val) {
  // 特殊判断
  if (val && parseInt(val) === 0) return false
  var list = ['$parent']
  if (typeof val === 'boolean') {
    return false
  }
  if (typeof val === 'number') {
    return false
  }
  if (val instanceof Array) {
    if (val.length === 0) return true
  } else if (val instanceof Object) {
    val = (0, deepClone)(val)
    list.forEach(function (ele) {
      delete val[ele]
    })
    if (JSON.stringify(val) === '{}') return true
  } else {
    if (val === 'null' || val == null || val === 'undefined' || val === undefined || val === '') {
      return true
    }
    return false
  }
  return false
}


function hashCode(str) {
  var hash = 0
  if (str.length === 0) return hash
  for (let i = 0; i < str.length; i++) {
    let char = str.charCodeAt(i)
    hash = ((hash << 5) - hash) + char
    hash = hash & hash // Convert to 32bit integer
  }
  return hash
}

// 驼峰转下划线
function toLine(name) {
  if (name.indexOf('.') < 0) {
    return name.replace(/([A-Z])/g, '_$1').toLowerCase()
  } else {
    return name
  }
}

//判断是否为数字（一位小数）
function isSingleDecimalNumber(valueNew, int) {
  let value = valueNew ? valueNew.toString() : '';
  if (value !== null && value !== undefined) {
    //清除“数字”和“.”以外的字符
    value = value.replace(/[^\d.]/g, "");
    //只保留第一个. 清除多余的
    value = value.replace(/\.{2,}/g, ".");
    value = value.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
    value = value.replace(/^(\-)*(\d+)\.(\d).*$/, '$1$2.$3');//只能输入两个小数
    value = value.replace(/^[.]/, ""); // 点开头的 删除
    //以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
    if (value.indexOf(".") < 0 && value !== "") {
      value = value.split('.')[0].substring(0, int)
      value = parseFloat(value);
    } else {
      if (value == '') value = ''
      else value = value.split('.')[0].substring(0, int) + '.' + (value.split('.')[1] ? value.split('.')[1] : '')
    }
    return value
  } else return null
}

/**
 * 处理null为‘--’
 */
export function dealNull(row, column, cellValue) {
  switch (cellValue) {
    case null:
      return '--'
    case undefined:
      return '--'
    case '':
      return '--'
    default:
      return cellValue
  }
}

/**
 * 处理null为‘--’
 */
export function dealNull2(row, column, cellValue) {
  switch (cellValue) {
    case null:
      return '--'
    case undefined:
      return '--'
    case '':
      return '--'
    default:
      return Number(cellValue).toFixed(2)
  }
}
/**
 * 处理null为‘--’
 */
export function dealNull4(row, column, cellValue) {
  switch (cellValue) {
    case null:
      return '--'
    case undefined:
      return '--'
    case '':
      return '--'
    default:
      return Number(cellValue).toFixed(4)
  }
}

export function getNull(value) {
  switch (value) {
    case null:
      return null
    case undefined:
      return null
    case '':
      return null
    default:
      return value
  }
}

export function getClientHeight() {
  let clientHeight
  if (document.body.clientHeight && document.documentElement.clientHeight) {
    clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight
  } else {
    clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight
  }
  return clientHeight
}

export function ifNull(value) {
  if (isNaN(value)) return true
  switch (value) {
    case null:
      return true
    case undefined:
      return true
    case '':
      return true
    default:
      return false
  }
}


//Base64是后台传回来的base64数据
export function handleDownloadQrIMg(base64, fileName = 'chart') {
  // 这里是获取到的图片base64编码,这里只是个例子哈，要自行编码图片替换这里才能测试看到效果
  const imgUrl = base64
  // 如果浏览器支持msSaveOrOpenBlob方法（也就是使用IE浏览器的时候），那么调用该方法去下载图片
  if (window.navigator.msSaveOrOpenBlob) {
    const bstr = atob(imgUrl.split(',')[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    const blob = new Blob([u8arr])
    window.navigator.msSaveOrOpenBlob(blob, fileName + '.' + 'png')
  } else {
    // 这里就按照chrome等新版浏览器来处理
    const a = document.createElement('a')
    a.href = imgUrl
    a.setAttribute('download', fileName)
    a.click()
  }
}


export function base64ImgtoFile(dataurl, filename = 'file') {
  let arr = dataurl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let suffix = mime.split('/')[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], `${filename}.${suffix}`, {
    type: mime
  })
}

export function saveElButtonDisabled(e, f) {
  if (e.target.tagName === 'SPAN') {
    if (f) {
      e.target.parentNode.disabled = 'disabled'
      e.target.disabled = 'disabled'
    } else {
      e.target.parentNode.removeAttribute('disabled')
      e.target.removeAttribute('disabled')
    }
  } else {
    e.target.disabled = 'disabled'
    if (f) {
      e.target.disabled = 'disabled'
    } else {
      e.target.removeAttribute('disabled')
    }
  }
}

/*生成uuid*/
export function uuid() {
  let s = [];
  let hexDigits = "0123456789abcdef";
  for (let i = 0; i < 36; i++) {
      s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  //s[14] = "4";
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  s[8] = s[13] = s[18] = s[23] = "-";
  let uuid = s.join("");
  return uuid;
}


export default {
  getClientHeight,
  toLine,
  escapeHTML,
  hashCode,
  unescapeHTML,
  deepClone,
  validatenull,
  dealNull,
  dealNull2,
  dealNull4,
  getNull,
  ifNull,
  saveElButtonDisabled,
  isSingleDecimalNumber,
  uuid
}
